//package com.koyi0000.mq.util.service;
//
//import org.springframework.stereotype.Component;
//
///**
// * @author koyi0000
// * Description  Date 2020/9/16 22:10
// **/
//@Component
//public class DistributedLockService extends CacheComponent{
//
//    public DistributedLockService() {
//        super(CacheContants.PrefixKey.distributed_lock);
//    }
//
//    /**
//     * 获取带超时特性的锁
//     *
//     * @param name        被锁对象
//     * @param lockTimeout 锁的超时时间，毫秒
//     * @return String, 失败时返回 null
//     */
//    public String acquire(String name, long lockTimeout) {
//        //不等待锁的获取，获取不到则立即失败（用于限制同一时间段内仅有一次业务处理，需配合异步释放锁来使用）
//        return this.acquire(name, lockTimeout, 1);
//    }
//
//    /**
//     * 获取带超时特性的锁
//     *
//     * @param name           被锁对象
//     * @param lockTimeout    锁的超时时间，毫秒
//     * @param acquireTimeout 获取锁过程的等待时间，毫秒
//     * @return String, 失败时返回 null
//     */
//    public String acquire(String name, long lockTimeout, long acquireTimeout) {
//        Jedis jedis = getClient();
//        String token = DistributedLockUtils.acquireWithTimeout(jedis, name, lockTimeout, acquireTimeout);
//        jedis.close();
//        return token;
//    }
//
//    /**
//     * 释放锁
//     *
//     * @param name  被锁对象
//     * @param token 锁的令牌（获取锁时返回的内容）
//     * @return true 成功，false 失败
//     */
//    public boolean release(String name, String token) {
//        Jedis jedis = getClient();
//        boolean release = DistributedLockUtils.release(jedis, name, token);
//        jedis.close();
//        return release;
//    }
//
//    /**
//     * 异步释放锁
//     *
//     * @param name   被锁对象
//     * @param token  锁的令牌（获取锁时返回的内容）
//     * @param millis 释放锁的延迟时间（毫秒）
//     * @return true 成功，false 失败
//     */
//    @Async
//    public void release(String name, String token, long millis) {
//        try {
//            Thread.sleep(millis);
//        } catch (InterruptedException e) {
//        }
//        this.release(name, token);
//    }
//
//    private Jedis getClient() {
//        JedisCommands client = super.getCacheEngine().getClient(super.prefix.getDbIndex());
//        if (!(client instanceof Jedis)) {
//            throw new UnsupportedOperationException("暂不支持Redis集群");
//        }
//        return (Jedis) client;
//    }
//
//    /**
//     * 获得调用者class name
//     *
//     * @return
//     */
//    private String getCallerClass() {
//        StackTraceElement[] stackTrace = new Exception().getStackTrace();
//        if (stackTrace.length == 0) {
//            return "";
//        }
//        return stackTrace[stackTrace.length - 1].getClassName();
//    }
//}
